"""
AI聊天服务 - 基于阿里云百炼
"""
import logging
from typing import List, Dict, Any
from sqlalchemy.orm import Session
from sqlalchemy import desc
from openai import OpenAI

from app.config import Settings
from app.models.diary import Diary
from app.models.embedding import Embedding
from app.services.embedding_service import embedding_service

logger = logging.getLogger(__name__)
settings = Settings()


class ChatService:
    """AI聊天服务"""
    
    def __init__(self):
        self.client = OpenAI(
            api_key=settings.dashscope_api_key,
            base_url=settings.dashscope_base_url
        )
        self.chat_model = "qwen-turbo"  # 阿里云最便宜的聊天模型
    
    async def search_similar_content(
        self, 
        db: Session, 
        user_id: int, 
        query: str, 
        limit: int = 5
    ) -> List[Dict[str, Any]]:
        """
        基于向量相似度搜索相关日记内容
        
        Args:
            db: 数据库会话
            user_id: 用户ID
            query: 查询问题
            limit: 返回结果数量限制
            
        Returns:
            相关日记内容列表
        """
        try:
            # 将查询转换为向量
            query_embedding = await embedding_service.create_single_embedding(query)
            
            # 搜索相似的向量
            # 注意：这里需要使用pgvector的相似度搜索功能
            similar_embeddings = db.query(Embedding)\
                .join(Diary)\
                .filter(Diary.user_id == user_id)\
                .order_by(Embedding.embedding.cosine_distance(query_embedding))\
                .limit(limit)\
                .all()
            
            # 整理搜索结果
            results = []
            for emb in similar_embeddings:
                results.append({
                    "diary_id": emb.diary_id,
                    "diary_title": emb.diary.title,
                    "content_chunk": emb.content_chunk,
                    "created_at": emb.diary.created_at.isoformat(),
                    "relevance_score": 0.85  # 简化版本，实际应计算余弦相似度
                })
            
            return results
            
        except Exception as e:
            logger.error(f"向量搜索失败: {str(e)}")
            # 降级到关键词搜索
            return await self.fallback_keyword_search(db, user_id, query, limit)
    
    async def fallback_keyword_search(
        self, 
        db: Session, 
        user_id: int, 
        query: str, 
        limit: int = 5
    ) -> List[Dict[str, Any]]:
        """
        降级方案：关键词搜索
        """
        diaries = db.query(Diary)\
            .filter(Diary.user_id == user_id)\
            .filter(Diary.content.contains(query))\
            .order_by(desc(Diary.created_at))\
            .limit(limit)\
            .all()
        
        results = []
        for diary in diaries:
            results.append({
                "diary_id": diary.id,
                "diary_title": diary.title,
                "content_chunk": diary.content[:200] + "...",
                "created_at": diary.created_at.isoformat(),
                "relevance_score": 0.6
            })
        
        return results
    
    async def chat_with_context(
        self, 
        question: str, 
        context_data: List[Dict[str, Any]]
    ) -> str:
        """
        基于上下文进行AI对话
        
        Args:
            question: 用户问题
            context_data: 相关日记内容
            
        Returns:
            AI回答
        """
        try:
            # 构建上下文信息
            context_text = "\n\n".join([
                f"日记《{item['diary_title']}》（{item['created_at'][:10]}）：\n{item['content_chunk']}"
                for item in context_data
            ])
            
            # 构建提示词
            system_prompt = """你是一个贴心的AI日记助手。基于用户的历史日记内容，为用户提供个性化的回答和建议。

请注意：
1. 基于提供的日记内容进行回答
2. 语言要温暖、贴心，就像朋友间的对话
3. 可以引用具体的日记内容来支持你的回答
4. 如果没有相关内容，请诚实说明并提供一般性建议
5. 回答要有深度，帮助用户反思和成长"""

            user_prompt = f"""相关日记内容：
{context_text}

用户问题：{question}

请基于上述日记内容，回答用户的问题。"""

            # 调用阿里云千问模型
            response = self.client.chat.completions.create(
                model=self.chat_model,
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                temperature=0.7,
                max_tokens=1000
            )
            
            return response.choices[0].message.content
            
        except Exception as e:
            logger.error(f"AI对话失败: {str(e)}")
            return f"抱歉，我暂时无法回答您的问题。请稍后再试。错误信息：{str(e)}"
    
    async def generate_insights(
        self, 
        db: Session, 
        user_id: int
    ) -> Dict[str, Any]:
        """
        生成个人洞察
        
        Args:
            db: 数据库会话
            user_id: 用户ID
            
        Returns:
            洞察分析结果
        """
        try:
            # 获取用户最近的日记
            recent_diaries = db.query(Diary)\
                .filter(Diary.user_id == user_id)\
                .order_by(desc(Diary.created_at))\
                .limit(10)\
                .all()
            
            if not recent_diaries:
                return {"message": "暂无足够的日记数据进行分析"}
            
            # 构建分析内容
            diary_contents = "\n\n".join([
                f"《{diary.title}》({diary.created_at.strftime('%Y-%m-%d')})：{diary.content[:300]}"
                for diary in recent_diaries
            ])
            
            system_prompt = """你是一个专业的心理分析师和人生导师。基于用户的日记内容，提供深度的个人洞察分析。

请从以下角度进行分析：
1. 情绪模式和变化趋势
2. 关注的主要生活领域
3. 成长和变化的迹象
4. 可能需要关注的方面
5. 积极的建议和鼓励

分析要有深度、准确，语言要温暖鼓励。"""

            user_prompt = f"""请分析以下日记内容，提供个人洞察：

{diary_contents}"""

            response = self.client.chat.completions.create(
                model=self.chat_model,
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                temperature=0.7,
                max_tokens=1500
            )
            
            return {
                "analysis": response.choices[0].message.content,
                "diary_count": len(recent_diaries),
                "analysis_period": f"{recent_diaries[-1].created_at.strftime('%Y-%m-%d')} 至 {recent_diaries[0].created_at.strftime('%Y-%m-%d')}"
            }
            
        except Exception as e:
            logger.error(f"洞察分析失败: {str(e)}")
            return {"error": f"分析失败：{str(e)}"}


# 创建全局实例
chat_service = ChatService() 